//原文链接:https://blog.csdn.net/ITSOK_123/article/details/124172021

//哈希集合解法
//用一个可以自动增长、可以快速查找的哈希集合保存已经求出的sum，
//然后在每次新求出平方和sum‘后就进行判断，
class Solution {
public:
    int getSum(int n){
        int sum = 0;
        //计算平方和
        while(n){
           sum += (n%10)*(n%10);
           n=n/10;  
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> iSet;
        while(true){
            //平方和为1则是快乐数
            int sum = getSum(n);
            if(sum==1) return true;
            //不是1就继续判断
            if(iSet.find(sum) != iSet.end()) return false;
            else{
                iSet.insert(sum);
            }
            n=sum;
        }
        
    }
};

//双指针解法
//
class Solution {
public:
    int getSum(int n){
        int sum = 0;
        //计算平方和
        while(n){
           sum += (n%10)*(n%10);
           n=n/10;  
        }
        return sum;
    }
    bool isHappy(int n) {
		//分别初始化慢快指针
        int slowPtr = n;
        int fastPtr = getSum(n);
		//fastPtr指向的值为1或者快慢指针相同是停止循环
        while(fastPtr != 1 && slowPtr != fastPtr){
            slowPtr = getSum(slowPtr);
            fastPtr = getSum(getSum(fastPtr));
        }
		//fastPtr指向的值为1则是快乐数
        return fastPtr == 1;
    }
};
